/**
 * 
 */
package cn.dgfy.MyBatisStudy.plugin;

import java.util.Properties;

import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.plugin.Intercepts;
import org.apache.ibatis.plugin.Invocation;
import org.apache.ibatis.plugin.Plugin;
import org.apache.ibatis.plugin.Signature;

/**
 * @author Tearfalls
 *
 */
/*
 * @Intercepts：完成插件签名，即说明此插件用来拦截哪个对象的哪个方法
 */
@Intercepts({
	/*
	 *  @Signature：定义需要拦截的对象及方法
	 */
	@Signature(
			type = org.apache.ibatis.executor.statement.StatementHandler.class, 
			method = "parameterize", 
			args = java.sql.Statement.class
	)
})
public class MyFirstPlugin implements Interceptor {
	
	/*
	 * 拦截目标对象的目标方法执行
	 */
	@Override
	public Object intercept(Invocation invocation) throws Throwable {
		
		System.out.println("MyFirstPlugin : intercept(Invocation invocation) : invocation.getMethod() = " + invocation.getMethod());
		
		// invocation.proceed()方法就是执行目标对象的目标方法并得到其返回值
		Object proceed = invocation.proceed();
		
		// 返回执行后的返回值
		return proceed;
	}
	
	/*
	 * 包装目标对象，即为目标对象创建一个代理对象
	 */
	@Override
	public Object plugin(Object target) {
		
		System.out.println("MyFirstPlugin : plugin(Object target) : target = " + target);
		
		// 借助MyBatis提供的Plugin类以指定的拦截器为目标对象创建一个动态代理
		// 也可以使用自定义的包装方法来为目标象创建动态代理
		Object wrap = Plugin.wrap(target, this);

		System.out.println("MyFirstPlugin : plugin(Object target) : wrap = " + wrap);
		
		return wrap;
	}
	
	/*
	 * 将插件注册时设置的property属性的值读入插件
	 */
	@Override
	public void setProperties(Properties properties) {
		System.out.println("MyFirstPlugin : setProperties(Properties properties) : properties = " + properties);
	}
	
}
